package com.mjf.operator;

/**
 * 左移：相当于乘以2的几次（例如：1 << 3 相当于 1 * 2的3次方）
 * 右移：相当于除以2的几次（例如：16 >> 3 相当于 16 / 2的3次方）
 * 无符号右移：不管最高位是什么，左边都补0，结果一定是正数
 *
 * 正数的原码反码补码相同
 * 负数 原码 转 反码（除了符号位其余1变0，0变 1）
 * 负数 反码 转 补码（加1）
 *
 */
public class BitOperator {
    public static void main(String[] args) {

        // 00000000 00000000 00000000 00001010    =>  2^1 + 2^3
        int i = 10;
        // 00000000 00000000 00000000 01010000    =>  2^4 + 2^6 = (2^1 + 2^3) * 2^3
        System.out.println(i << 3);     // 左移：相当于乘以2的3次
        // 00000000 00000000 00000000 00000001    =>  2^0 = (2^1 + 2^3) / 2^3
        System.out.println(i >> 3);     // 右移：相当于除以2的3次

        // 原码：10000000 00000000 00000000 00001010    =>  -2^1 - 2^3
        int j = -10;
        // 反码：11111111 11111111 11111111 11110101
        // 补码：11111111 11111111 11111111 11110110
        // 左移 3
        // 补码：11111111 11111111 11111111 10110000
        // 反码：11111111 11111111 11111111 10101111
        // 原码：10000000 00000000 00000000 01010000   =>  -2^4 - 2^6 = (-2^1 - 2^3) * 2^3
        System.out.println(j << 3);
        // 原码：10000000 00000000 00000000 00001010    =>  -2^1 - 2^3
        // 反码：11111111 11111111 11111111 11110101
        // 补码：11111111 11111111 11111111 11110110
        // 右移 3
        // 补码：11111111 11111111 11111111 11111110
        // 反码：11111111 11111111 11111111 11111101
        // 原码：10000000 00000000 00000000 00000010   =>  -2^1 = (-2^1 - 2^3) / 2^3
        System.out.println(j >> 3);

        int x = 10;
        System.out.println(x >>> 3);

        int y = -10;
        System.out.println(y >>> 3);

    }
}
